/*! * \brief Upgrade the Line to a Polyline * * Convert the _Line to a _Polyline with the position clicked as third point. * Further object properties are preserved by the use of object_substitute() * * @param obj self pointer * @param clicked last clicked point on canvas or NULL * @param data here unuesed user_data pointer * @return an _ObjectChange to support undo/redo * * \memberof Line */ static ObjectChange * _convert_to_polyline_callback (DiaObject *obj, Point *clicked, gpointer data) { DiaObject *poly; Line *line = (Line *)obj; Point points[3]; points[0] = line->connection.endpoints[0]; points[2] = line->connection.endpoints[1]; if (clicked) { points[1] = *clicked; } else { points[1].x = (points[0].x + points[2].x) / 2; points[1].y = (points[0].y + points[2].y) / 2; } poly = create_standard_polyline (3, points, &line->end_arrow, &line->start_arrow); g_return_val_if_fail (poly != NULL, NULL); return object_substitute (obj, poly); }
static DiaObject * fig_read_polyline(FILE *file, DiaContext *ctx) { int sub_type; int line_style; int thickness; int pen_color; int fill_color; int depth; int pen_style; int area_fill; real style_val; int join_style; int cap_style; int radius; int forward_arrow, backward_arrow; Arrow *forward_arrow_info = NULL, *backward_arrow_info = NULL; int npoints; Point *points; GPtrArray *props = g_ptr_array_new(); DiaObject *newobj = NULL; int flipped = 0; char *image_file = NULL; char* old_locale; old_locale = setlocale(LC_NUMERIC, "C"); if (fscanf(file, "%d %d %d %d %d %d %d %d %lf %d %d %d %d %d %d\n", &sub_type, &line_style, &thickness, &pen_color, &fill_color, &depth, &pen_style, &area_fill, &style_val, &join_style, &cap_style, &radius, &forward_arrow, &backward_arrow, &npoints) != 15) { dia_context_add_message_with_errno(ctx, errno, _("Couldn't read polyline info.\n")); goto exit; } if (forward_arrow == 1) { forward_arrow_info = fig_read_arrow(file, ctx); } if (backward_arrow == 1) { backward_arrow_info = fig_read_arrow(file, ctx); } if (sub_type == 5) { /* image has image name before npoints */ /* Despite what the specs say */ if (fscanf(file, " %d", &flipped) != 1) { dia_context_add_message_with_errno(ctx, errno, _("Couldn't read flipped bit.")); goto exit; } image_file = fig_read_text_line(file); } if (!fig_read_n_points(file, npoints, &points, ctx)) { goto exit; } switch (sub_type) { case 4: { RealProperty *rprop = (RealProperty *)make_new_prop("corner_radius", PROP_TYPE_REAL,PROP_FLAG_DONT_SAVE); if (radius < 0) { dia_context_add_message(ctx, _("Negative corner radius; negating")); rprop->real_data = -radius/FIG_ALT_UNIT; } else { rprop->real_data = radius/FIG_ALT_UNIT; } g_ptr_array_add(props,rprop); } /* Notice fallthrough */ case 2: /* box */ if (points[0].x > points[2].x) { real tmp = points[0].x; points[0].x = points[2].x; points[2].x = tmp; } if (points[0].y > points[2].y) { real tmp = points[0].y; points[0].y = points[2].y; points[2].y = tmp; } newobj = create_standard_box(points[0].x, points[0].y, points[2].x-points[0].x, points[2].y-points[0].y); if (newobj == NULL) goto exit; newobj->ops->set_props(newobj, props); break; case 5: /* imported-picture bounding-box) */ newobj = create_standard_image(points[0].x, points[0].y, points[2].x-points[0].x, points[2].y-points[0].y, image_file); if (newobj == NULL) goto exit; break; case 1: /* polyline */ newobj = create_standard_polyline(npoints, points, forward_arrow_info, backward_arrow_info); if (newobj == NULL) goto exit; break; case 3: /* polygon */ newobj = create_standard_polygon(npoints, points); if (newobj == NULL) goto exit; break; default: dia_context_add_message(ctx, _("Unknown polyline subtype: %d\n"), sub_type); goto exit; } fig_simple_properties(newobj, line_style, style_val, thickness, pen_color, fill_color, area_fill, ctx); /* Pen style field (not used) */ /* Style_val (size of dots and dashes) in 1/80 inch*/ /* Join style */ /* Cap style */ /* Depth field */ add_at_depth(newobj, depth, ctx); exit: setlocale(LC_NUMERIC, old_locale); prop_list_free(props); g_free(forward_arrow_info); g_free(backward_arrow_info); g_free(image_file); return newobj; }