app/vectors/Makefile.am added a simple GimpAnchor API.

2003-07-17  Sven Neumann  <sven@gimp.org>

	* app/vectors/Makefile.am
	* app/vectors/gimpanchor.[ch]: added a simple GimpAnchor API.

	* app/vectors/gimpbezierstroke.c
	* app/vectors/gimpstroke.c: use the new functions.
This commit is contained in:
Sven Neumann 2003-07-17 18:06:32 +00:00 committed by Sven Neumann
parent 517cd3651e
commit 7c4d375aa9
6 changed files with 110 additions and 39 deletions

View File

@ -1,3 +1,11 @@
2003-07-17 Sven Neumann <sven@gimp.org>
* app/vectors/Makefile.am
* app/vectors/gimpanchor.[ch]: added a simple GimpAnchor API.
* app/vectors/gimpbezierstroke.c
* app/vectors/gimpstroke.c: use the new functions.
2003-07-17 Jakub Steiner <jimmac@ximian.com>
* plug-ins/common/*.c: added mnemonics for plugins

View File

@ -15,6 +15,7 @@ noinst_LIBRARIES = libappvectors.a
libappvectors_a_SOURCES = \
vectors-types.h \
gimpanchor.c \
gimpanchor.h \
gimpbezierstroke.h \
gimpbezierstroke.c \

55
app/vectors/gimpanchor.c Normal file
View File

@ -0,0 +1,55 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpanchor.c
* Copyright (C) 2002 Simon Budig <simon@gimp.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include "glib-object.h"
#include "vectors-types.h"
#include "gimpanchor.h"
GimpAnchor *
gimp_anchor_new (GimpAnchorType type,
const GimpCoords *position)
{
GimpAnchor *anchor = g_new0 (GimpAnchor, 1);
anchor->type = type;
if (position)
anchor->position = *position;
return anchor;
}
void
gimp_anchor_free (GimpAnchor *anchor)
{
g_free (anchor);
}
GimpAnchor *
gimp_anchor_duplicate (const GimpAnchor *anchor)
{
return g_memdup (anchor, sizeof (GimpAnchor));
}

View File

@ -1,6 +1,6 @@
/* The GIMP -- an image manipulation program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
*
* gimpanchor.h
* Copyright (C) 2002 Simon Budig <simon@gimp.org>
*
@ -31,4 +31,11 @@ struct _GimpAnchor
gboolean selected;
};
GimpAnchor * gimp_anchor_new (GimpAnchorType type,
const GimpCoords *position);
void gimp_anchor_free (GimpAnchor *anchor);
GimpAnchor * gimp_anchor_duplicate (const GimpAnchor *anchor);
#endif /* __GIMP_ANCHOR_H__ */

View File

@ -3,7 +3,7 @@
*
* gimpstroke.c
* Copyright (C) 2002 Simon Budig <simon@gimp.org>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@ -113,7 +113,7 @@ gimp_bezier_stroke_get_type (void)
};
bezier_stroke_type = g_type_register_static (GIMP_TYPE_STROKE,
"GimpBezierStroke",
"GimpBezierStroke",
&bezier_stroke_info, 0);
}
@ -166,6 +166,7 @@ gimp_bezier_stroke_new (void)
stroke->anchors = NULL;
stroke->closed = FALSE;
return stroke;
}
@ -224,9 +225,7 @@ gimp_bezier_stroke_extend (GimpBezierStroke *bezier_stroke,
/* assure that there is no neighbor specified */
g_return_val_if_fail (neighbor == NULL, NULL);
anchor = g_new0 (GimpAnchor, 1);
anchor->position = *coords;
anchor->type = GIMP_ANCHOR_CONTROL;
anchor = gimp_anchor_new (GIMP_ANCHOR_CONTROL, coords);
stroke->anchors = g_list_append (stroke->anchors, anchor);
@ -247,9 +246,11 @@ gimp_bezier_stroke_extend (GimpBezierStroke *bezier_stroke,
EXTEND_SIMPLE);
break;
default:
anchor = NULL;
}
return anchor;
}
else
@ -324,6 +325,8 @@ gimp_bezier_stroke_extend (GimpBezierStroke *bezier_stroke,
if (loose_end)
{
GimpAnchorType type;
/* We have to detect the type of the point to add... */
control_count = 0;
@ -350,28 +353,28 @@ gimp_bezier_stroke_extend (GimpBezierStroke *bezier_stroke,
switch (extend_mode)
{
case EXTEND_SIMPLE:
anchor = g_new0 (GimpAnchor, 1);
anchor->position = *coords;
switch (control_count)
{
case 0:
anchor->type = GIMP_ANCHOR_CONTROL;
type = GIMP_ANCHOR_CONTROL;
break;
case 1:
if (listneighbor) /* only one handle in the path? */
anchor->type = GIMP_ANCHOR_CONTROL;
type = GIMP_ANCHOR_CONTROL;
else
anchor->type = GIMP_ANCHOR_ANCHOR;
type = GIMP_ANCHOR_ANCHOR;
break;
case 2:
anchor->type = GIMP_ANCHOR_ANCHOR;
type = GIMP_ANCHOR_ANCHOR;
break;
default:
g_printerr ("inconsistent bezier curve: "
"%d successive control handles", control_count);
g_warning ("inconsistent bezier curve: "
"%d successive control handles", control_count);
type = GIMP_ANCHOR_ANCHOR;
}
anchor = gimp_anchor_new (type, coords);
if (loose_end == 1)
stroke->anchors = g_list_append (stroke->anchors, anchor);
@ -406,8 +409,8 @@ gimp_bezier_stroke_extend (GimpBezierStroke *bezier_stroke,
EXTEND_SIMPLE);
break;
default:
g_printerr ("inconsistent bezier curve: "
"%d successive control handles", control_count);
g_warning ("inconsistent bezier curve: "
"%d successive control handles", control_count);
}
}
@ -542,8 +545,8 @@ gimp_bezier_stroke_anchor_convert (GimpStroke *stroke,
break;
default:
g_printerr ("gimp_bezier_stroke_anchor_convert: "
"unimplemented anchor conversion %d\n", feature);
g_warning ("gimp_bezier_stroke_anchor_convert: "
"unimplemented anchor conversion %d\n", feature);
}
}
@ -560,7 +563,7 @@ gimp_bezier_stroke_interpolate (const GimpStroke *stroke,
g_return_val_if_fail (GIMP_IS_BEZIER_STROKE (stroke), NULL);
g_return_val_if_fail (ret_closed != NULL, NULL);
if (!stroke->anchors)
{
*ret_closed = FALSE;
@ -604,7 +607,7 @@ gimp_bezier_stroke_interpolate (const GimpStroke *stroke,
segmentcoords[3] = ((GimpAnchor *) anchorlist->data)->position;
gimp_bezier_coords_subdivide (segmentcoords, precision, &ret_coords);
}
ret_coords = g_array_append_val (ret_coords, segmentcoords[3]);
@ -646,7 +649,7 @@ gimp_bezier_coords_mix (const gdouble amul,
}
}
/* (a+b)/2 */
static void
@ -738,7 +741,7 @@ gimp_bezier_coords_length (const GimpCoords *a)
/*
* a helper function that determines if a bezier segment is "straight
* enough" to be approximated by a line.
*
*
* Needs four GimpCoords in an array.
*/
@ -876,7 +879,7 @@ gimp_bezier_coords_subdivide2 (const GimpCoords *beziercoords,
gimp_bezier_coords_subdivide2 (&(subdivided[3]), precision,
ret_coords, depth-1);
}
/* g_printerr ("gimp_bezier_coords_subdivide end: %d entries\n", (*ret_coords)->len); */
}

View File

@ -3,7 +3,7 @@
*
* gimpstroke.c
* Copyright (C) 2002 Simon Budig <simon@gimp.org>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
@ -101,7 +101,7 @@ gimp_stroke_get_type (void)
};
stroke_type = g_type_register_static (GIMP_TYPE_OBJECT,
"GimpStroke",
"GimpStroke",
&stroke_info, 0);
}
@ -162,12 +162,15 @@ static void
gimp_stroke_finalize (GObject *object)
{
GimpStroke *stroke;
GList *list;
stroke = GIMP_STROKE (object);
#ifdef __GNUC__
#warning FIXME: implement gimp_stroke_finalize()
#endif
for (list = stroke->anchors; list; list = list->next)
gimp_anchor_free ((GimpAnchor *) list->data);
if (stroke->temp_anchor)
gimp_anchor_free (stroke->temp_anchor);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@ -274,7 +277,7 @@ gimp_stroke_real_anchor_get_next (const GimpStroke *stroke,
if (list)
return (GimpAnchor *) list->data;
return NULL;
}
@ -533,18 +536,12 @@ gimp_stroke_real_duplicate (const GimpStroke *stroke)
for (list = new_stroke->anchors; list; list = g_list_next (list))
{
GimpAnchor *new_anchor = g_new0 (GimpAnchor, 1);
*new_anchor = *((GimpAnchor *) (list->data));
list->data = new_anchor;
list->data = gimp_anchor_duplicate ((GimpAnchor *) list->data);
}
if (stroke->temp_anchor)
{
new_stroke->temp_anchor = g_new0 (GimpAnchor, 1);
*(new_stroke->temp_anchor) = *(stroke->temp_anchor);
new_stroke->temp_anchor = gimp_anchor_duplicate (stroke->temp_anchor);
}
return new_stroke;
@ -628,7 +625,7 @@ gimp_stroke_real_get_draw_controls (const GimpStroke *stroke)
return g_list_reverse (ret_list);
}
GArray *
gimp_stroke_get_draw_lines (const GimpStroke *stroke)