name the vectors after the path id as found in the SVG.

2003-09-15  Sven Neumann  <sven@gimp.org>

	* app/vectors/gimpvectors-import.c: name the vectors after the
	path id as found in the SVG.

	* app/vectors/gimpvectors-export.c: further improved formatting.
This commit is contained in:
Sven Neumann 2003-09-15 12:14:12 +00:00 committed by Sven Neumann
parent d885f25196
commit 00c7d7b402
3 changed files with 68 additions and 35 deletions

View File

@ -1,3 +1,10 @@
2003-09-15 Sven Neumann <sven@gimp.org>
* app/vectors/gimpvectors-import.c: name the vectors after the
path id as found in the SVG.
* app/vectors/gimpvectors-export.c: further improved formatting.
2003-09-15 Simon Budig <simon@gimp.org>
* app/vectors/gimpvectors-export.c: Save an id-attribute

View File

@ -80,10 +80,10 @@ gimp_vectors_export (const GimpImage *image,
fprintf (file,
"<?xml version=\"1.0\" standalone=\"no\"?>\n"
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20010904//EN\"\n"
"\"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n");
" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n");
fprintf (file,
"<svg viewBox=\"0 0 %d %d\"\n"
" xmlns=\"http://www.w3.org/2000/svg\">\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\"\n"
" viewBox=\"0 0 %d %d\">\n\n",
image->width, image->height);
if (vectors)
@ -98,8 +98,7 @@ gimp_vectors_export (const GimpImage *image,
gimp_vectors_export_path (GIMP_VECTORS (list->data), file);
}
fprintf (file,
"</svg>\n");
fprintf (file, "</svg>\n");
if (fclose (file))
{
@ -119,13 +118,13 @@ gimp_vectors_export_path (const GimpVectors *vectors,
const gchar *name = gimp_object_get_name (GIMP_OBJECT (vectors));
gchar *data = gimp_vectors_path_data (vectors);
gchar *esc_name;
esc_name = g_markup_escape_text (name, strlen (name));
fprintf (file,
" <path id=\"%s\"\n"
" fill=\"none\" stroke=\"black\" stroke-width=\"1\"\n"
" d=\"%s\"/>\n",
" d=\"%s\" />\n",
esc_name, data);
g_free (esc_name);
@ -183,11 +182,11 @@ gimp_vectors_path_data (const GimpVectors *vectors)
g_string_append_printf (str, " %s,%s", x_string, y_string);
if (i % 3 == 1)
g_string_append_printf (str, "\n ");
g_string_append_printf (str, "\n ");
}
if (closed && control_points->len > 3)
g_string_append_printf (str, "Z");
g_string_append_printf (str, "Z");
}
else
{
@ -218,15 +217,15 @@ gimp_vectors_path_data (const GimpVectors *vectors)
g_string_append_printf (str, " %s,%s", x_string, y_string);
if (i % 3 == 1)
g_string_append_printf (str, "\n ");
g_string_append_printf (str, "\n ");
}
if (closed && control_points->len > 1)
g_string_append_printf (str, " Z");
g_string_append_printf (str, " Z");
}
g_array_free (control_points, TRUE);
}
return g_string_free (str, FALSE);
return g_strchomp (g_string_free (str, FALSE));
}

View File

@ -46,12 +46,12 @@
typedef struct _SvgHandler SvgHandler;
struct _SvgHandler
{
const gchar *name;
gdouble width;
gdouble height;
gchar *id;
GList *paths;
GimpMatrix3 *transform;
@ -60,6 +60,12 @@ struct _SvgHandler
const gchar **values);
};
typedef struct
{
gchar *id;
GList *strokes;
} SvgPath;
static void svg_parser_start_element (GMarkupParseContext *context,
const gchar *element_name,
@ -94,10 +100,10 @@ static void svg_handler_path (SvgHandler *handler,
static SvgHandler svg_handlers[] =
{
{ "svg", 0, 0, NULL, NULL, svg_handler_svg },
{ "g", 0, 0, NULL, NULL, svg_handler_group },
{ "path", 0, 0, NULL, NULL, svg_handler_path },
{ NULL, 0, 0, NULL, NULL, NULL }
{ "svg", 0, 0, NULL, NULL, NULL, svg_handler_svg },
{ "g", 0, 0, NULL, NULL, NULL, svg_handler_group },
{ "path", 0, 0, NULL, NULL, NULL, svg_handler_path },
{ NULL, 0, 0, NULL, NULL, NULL, NULL }
};
@ -132,7 +138,6 @@ gimp_vectors_import (GimpImage *image,
FILE *file;
GQueue *stack;
GList *paths;
GList *list;
SvgHandler *base;
gboolean success = TRUE;
gsize bytes;
@ -178,31 +183,41 @@ gimp_vectors_import (GimpImage *image,
{
if (base->paths)
{
GimpVectors *vectors;
GimpVectors *vectors = NULL;
base->paths = g_list_reverse (base->paths);
merge = merge && base->paths->next;
gimp_image_undo_group_start (image, GIMP_UNDO_GROUP_VECTORS_IMPORT,
_("Import Paths"));
vectors = gimp_vectors_new (image, _("Imported Path"));
for (paths = base->paths; paths; paths = paths->next)
{
for (list = paths->data; list; list = list->next)
gimp_vectors_stroke_add (vectors, GIMP_STROKE (list->data));
SvgPath *path = paths->data;
GList *list;
if (!merge && paths->next)
if (!merge || !vectors)
{
vectors = gimp_vectors_new (image,
((merge || !path->id) ?
_("Imported Path") : path->id));
gimp_image_add_vectors (image, vectors, -1);
vectors = gimp_vectors_new (image, _("Imported Path"));
gimp_vectors_freeze (vectors);
}
g_list_free (paths->data);
paths->data = NULL;
for (list = path->strokes; list; list = list->next)
gimp_vectors_stroke_add (vectors, GIMP_STROKE (list->data));
if (!merge)
gimp_vectors_thaw (vectors);
g_list_free (path->strokes);
path->strokes = NULL;
}
gimp_image_add_vectors (image, vectors, -1);
if (merge)
gimp_vectors_thaw (vectors);
gimp_image_undo_group_end (image);
}
@ -217,10 +232,14 @@ gimp_vectors_import (GimpImage *image,
{
for (paths = base->paths; paths; paths = paths->next)
{
for (list = paths->data; list; list = list->next)
SvgPath *path = paths->data;
GList *list;
for (list = path->strokes; list; list = list->next)
g_object_unref (list->data);
g_list_free (paths->data);
g_free (path->id);
g_list_free (path->strokes);
}
g_list_free (base->paths);
@ -285,9 +304,10 @@ svg_parser_end_element (GMarkupParseContext *context,
{
for (paths = handler->paths; paths; paths = paths->next)
{
GList *list;
SvgPath *path = paths->data;
GList *list;
for (list = paths->data; list; list = list->next)
for (list = path->strokes; list; list = list->next)
gimp_stroke_transform (GIMP_STROKE (list->data),
handler->transform);
}
@ -347,12 +367,17 @@ svg_handler_path (SvgHandler *handler,
const gchar **names,
const gchar **values)
{
SvgPath *path = g_new0 (SvgPath, 1);
while (*names)
{
if (strcmp (*names, "d") == 0)
if (strcmp (*names, "id") == 0 && !path->id)
{
handler->paths = g_list_prepend (handler->paths,
parse_path_data (*values));
path->id = g_strdup (*values);
}
else if (strcmp (*names, "d") == 0 && !path->strokes)
{
path->strokes = parse_path_data (*values);
}
else if (strcmp (*names, "transform") == 0 && !handler->transform)
{
@ -365,6 +390,8 @@ svg_handler_path (SvgHandler *handler,
names++;
values++;
}
handler->paths = g_list_prepend (handler->paths, path);
}
static gboolean