/* The GIMP -- an image manipulation program
 * 
 * This file Copyright (C) 1999 Simon Budig
 *
 * 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.
 */

#ifndef __PATH_TOOL_H__
#define __PATH_TOOL_H__

/*
 * Every new curve-type has to have a parameter between 0 and 1, and
 * should go from a starting to a target point.
 */

/* Some defines... */

#define PATH_TOOL_WIDTH 8
#define PATH_TOOL_HALFWIDTH 4

/*  function prototypes  */


/* Small functions to determine coordinates, iterate over path/curve/segment */

void    path_segment_get_coordinates (PathSegment *,
				      gdouble,
				      gint *,
				      gint *);
void    path_traverse_path           (NPath *,
				      PathTraverseFunc,
				      CurveTraverseFunc,
				      SegmentTraverseFunc,
				      gpointer);
void    path_traverse_curve          (NPath *,
				      PathCurve *,
				      CurveTraverseFunc,
				      SegmentTraverseFunc,
				      gpointer);
void    path_traverse_segment        (NPath *,
				      PathCurve *,
				      PathSegment *,
				      SegmentTraverseFunc,
				      gpointer);
gdouble path_locate_point            (NPath *,
				      PathCurve **,
				      PathSegment **,
				      gint,
				      gint,
				      gint,
				      gint,
				      gint);

/* Tools to manipulate paths, curves, segments */

PathCurve   * path_add_curve       (NPath *,
				    gdouble,
				    gdouble);
PathSegment * path_append_segment  (NPath *,
				    PathCurve *,
				    SegmentType,
				    gdouble,
				    gdouble);
PathSegment * path_prepend_segment (NPath *,
				    PathCurve *,
				    SegmentType,
				    gdouble,
				    gdouble);
PathSegment * path_split_segment   (PathSegment *,
				    gdouble);
void          path_join_curves     (PathSegment *,
				    PathSegment *);
void          path_flip_curve      (PathCurve *);
void          path_free_path       (NPath *);
void          path_free_curve      (PathCurve *);
void          path_free_segment    (PathSegment *);
void          path_delete_segment  (PathSegment *);
void          path_print           (NPath *);
void          path_offset_active   (NPath *, gdouble, gdouble);
void          path_set_flags       (GimpPathTool *,
				    NPath *,
				    PathCurve *,
				    PathSegment *,
				    guint32,
				    guint32);

gdouble  gimp_path_tool_on_curve   (GimpPathTool *, gint, gint, gint,
		                    NPath**, PathCurve**, PathSegment**);
gboolean gimp_path_tool_on_anchors (GimpPathTool *, gint, gint, gint,
		                    NPath**, PathCurve**, PathSegment**);
gint     gimp_path_tool_on_handles (GimpPathTool *, gint, gint, gint,
		                    NPath **, PathCurve **, PathSegment **);

gint     path_tool_cursor_position (NPath *path,
                                    gdouble x,
                                    gdouble y,
                                    gint halfwidth,
                                    NPath **pathP,
                                    PathCurve **curveP,
                                    PathSegment **segmentP,
                                    gdouble *positionP,
                                    gint *handle_idP);

/* High level image-manipulation functions */

void path_stroke                   (GimpPathTool *,
				    NPath *);
void path_to_selection             (GimpPathTool *,
				    NPath *);


#endif  /* __PATH_TOOL_H__ */

