--- /dev/null
+/*\r
+ * GPAC - Multimedia Framework C SDK\r
+ *\r
+ * Copyright (c) Jean Le Feuvre 2000-2005\r
+ * All rights reserved\r
+ *\r
+ * This file is part of GPAC / common tools sub-project\r
+ *\r
+ * GPAC is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU Lesser General Public License as published by\r
+ * the Free Software Foundation; either version 2, or (at your option)\r
+ * any later version.\r
+ * \r
+ * GPAC is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU Lesser General Public License for more details.\r
+ * \r
+ * You should have received a copy of the GNU Lesser General Public\r
+ * License along with this library; see the file COPYING. If not, write to\r
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. \r
+ *\r
+ */\r
+\r
+\r
+#ifndef _GF_PATH2D_H_\r
+#define _GF_PATH2D_H_\r
+\r
+/*!\r
+ * \file <gpac/path2d.h>\r
+ * \brief 2D Vectorial Path functions.\r
+ */\r
+\r
+\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#include <gpac/math.h>\r
+#include <gpac/constants.h>\r
+\r
+\r
+/*!\r
+ *\addtogroup path_grp path2d\r
+ *\ingroup utils_grp\r
+ *\brief Vectorial 2D Path manipulation functions\r
+ *\r
+ *This section documents the 2D path object used in the GPAC framework. \r
+ * @{\r
+ */\r
+\r
+ \r
+/*!\brief 2D Path Object\r
+ *\r
+ *The 2D path object is used to construct complex 2D shapes for later drawing\r
+ * or outlining.\r
+ */\r
+typedef struct\r
+{\r
+ /*! number of contours in path*/\r
+ u32 n_contours;\r
+ /*! number of points in path and alloc size*/\r
+ u32 n_points, n_alloc_points;\r
+ /*! path points */\r
+ GF_Point2D *points;\r
+ /*! point tags (one per point)*/\r
+ u8 *tags;\r
+ /*! contour end points*/\r
+ u32 *contours;\r
+ /*! path bbox - NEVER USE WITHOUT FIRST CALLING \ref gf_path_get_bounds*/\r
+ GF_Rect bbox;\r
+ /*! path flags*/\r
+ s32 flags;\r
+ /*! fineness to use whenever flattening the path - default is \ref FIX_ONE*/\r
+ Fixed fineness;\r
+} GF_Path;\r
+\r
+\r
+/*!\r
+ * \brief path constructor\r
+ *\r
+ * Constructs an empty 2D path object\r
+ * \return new path object\r
+ */\r
+GF_Path *gf_path_new();\r
+/*!\r
+ * \brief path destructor\r
+ *\r
+ * Destructs a 2D path object\r
+ * \param gp the target path\r
+ */\r
+void gf_path_del(GF_Path *gp);\r
+/*!\r
+ * \brief path reset\r
+ *\r
+ * Resets the 2D path object\r
+ * \param gp the target path\r
+ */\r
+void gf_path_reset(GF_Path *gp);\r
+/*!\r
+ * \brief path copy constuctor\r
+ *\r
+ * Resets a copy of a 2D path object\r
+ * \param gp the target path\r
+ * \return new path copy\r
+ */\r
+GF_Path *gf_path_clone(GF_Path *gp);\r
+/*!\r
+ * \brief path close\r
+ *\r
+ * Closes current path contour\r
+ * \param gp the target path\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_close(GF_Path *gp);\r
+/*!\r
+ * \brief path moveTo\r
+ *\r
+ * Starts a new contour from the specified point\r
+ * \param gp the target path\r
+ * \param x x-coordinate of the new point\r
+ * \param y y-coordinate of the new point\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_move_to(GF_Path *gp, Fixed x, Fixed y);\r
+/*!\r
+ * \brief starts new contour\r
+ *\r
+ * Starts a new contour from the specified point\r
+ * \param gp the target path\r
+ * \param pt pointer to the new start point\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_move_to_vec(GF_Path *gp, GF_Point2D *pt);\r
+/*!\r
+ * \brief adds line to path\r
+ *\r
+ * Adds a line from the current point in path to the specified point\r
+ * \param gp the target path\r
+ * \param x x-coordinate of the line end\r
+ * \param y y-coordinate of the line end\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_line_to(GF_Path *gp, Fixed x, Fixed y);\r
+/*!\r
+ * \brief adds line to path\r
+ *\r
+ * Adds a line from the current point in path to the specified point\r
+ * \param gp the target path\r
+ * \param pt line end\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_line_to_vec(GF_Path *gp, GF_Point2D *pt);\r
+/*!\r
+ * \brief adds cubic to path\r
+ *\r
+ * Adds a cubic bezier curve to the current contour, starting from the current path point\r
+ * \param gp the target path\r
+ * \param c1_x x-coordinate of the first control point of the cubic curve\r
+ * \param c1_y y-coordinate of the first control point of the cubic curve\r
+ * \param c2_x x-coordinate of the second control point of the cubic curve\r
+ * \param c2_y y-coordinate of the second control point of the cubic curve\r
+ * \param x x-coordinate of the end point of the cubic curve\r
+ * \param y y-coordinate of the end point of the cubic curve\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_cubic_to(GF_Path *gp, Fixed c1_x, Fixed c1_y, Fixed c2_x, Fixed c2_y, Fixed x, Fixed y);\r
+/*!\r
+ * \brief adds cubic to path\r
+ *\r
+ * Adds a cubic bezier curve to the current contour, starting from the current path point\r
+ * \param gp the target path\r
+ * \param c1 first control point of the cubic curve\r
+ * \param c2 second control point of the cubic curve\r
+ * \param pt end point of the cubic curve\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_cubic_to_vec(GF_Path *gp, GF_Point2D *c1, GF_Point2D *c2, GF_Point2D *pt);\r
+/*!\r
+ * \brief adds quadratic to path\r
+ *\r
+ * Adds a quadratic bezier curve to the current contour, starting from the current path point\r
+ * \param gp the target path\r
+ * \param c_x x-coordinate of the control point of the quadratic curve\r
+ * \param c_y y-coordinate of the control point of the quadratic curve\r
+ * \param x x-coordinate of the end point of the cubic quadratic\r
+ * \param y y-coordinate of the end point of the cubic quadratic\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_quadratic_to(GF_Path *gp, Fixed c_x, Fixed c_y, Fixed x, Fixed y);\r
+/*!\r
+ * \brief adds quadratic to path\r
+ *\r
+ * Adds a quadratic bezier curve to the current contour, starting from the current path point\r
+ * \param gp the target path\r
+ * \param c control point of the quadratic curve\r
+ * \param pt end point of the cubic quadratic\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_quadratic_to_vec(GF_Path *gp, GF_Point2D *c, GF_Point2D *pt);\r
+/*!\r
+ * \brief adds rectangle to path\r
+ *\r
+ * Adds a rectangle contour to the path\r
+ * \param gp the target path\r
+ * \param cx x-coordinate of the rectangle center\r
+ * \param cy y-coordinate of the rectangle center\r
+ * \param w width of the rectangle\r
+ * \param h height of the rectangle\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_rect_center(GF_Path *gp, Fixed cx, Fixed cy, Fixed w, Fixed h);\r
+/*!\r
+ * \brief adds rectangle to path\r
+ *\r
+ * Adds a rectangle contour to the path\r
+ * \param gp the target path\r
+ * \param ox left-most coordinate of the rectangle \r
+ * \param oy top-most coordinate of the rectangle\r
+ * \param w width of the rectangle\r
+ * \param h height of the rectangle\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_rect(GF_Path *gp, Fixed ox, Fixed oy, Fixed w, Fixed h);\r
+/*!\r
+ * \brief adds ellipse to path\r
+ *\r
+ * Adds an ellipse contour to the path\r
+ * \param gp the target path\r
+ * \param cx x-coordinate of the ellipse center\r
+ * \param cy y-coordinate of the ellipse center\r
+ * \param a_axis length of the horizontal ellipse axis\r
+ * \param b_axis length of the vertical ellipse axis\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_ellipse(GF_Path *gp, Fixed cx, Fixed cy, Fixed a_axis, Fixed b_axis);\r
+/*!\r
+ * \brief adds N-bezier curve to path\r
+ *\r
+ * Adds an N-degree bezier curve to the path, starting from the current point\r
+ * \param gp the target path\r
+ * \param pts points used to define the curve\r
+ * \param nb_pts number of points used to define the curve. The degree of the curve is therefore (nb_pts-1).\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ * \note the fineness of the path must be set before calling this function.\r
+ */\r
+GF_Err gf_path_add_bezier(GF_Path *gp, GF_Point2D *pts, u32 nb_pts);\r
+/*!\r
+ * \brief adds arc as described in MPEG-4 BIFS to path\r
+ *\r
+ * Adds an arc contour to the path from focal and end points.\r
+ * \param gp the target path\r
+ * \param end_x x-coordinate of the arc end point\r
+ * \param end_y y-coordinate of the arc end point\r
+ * \param fa_x x-coordinate of the arc first focal point\r
+ * \param fa_y y-coordinate of the arc first focal point\r
+ * \param fb_x x-coordinate of the arc second focal point\r
+ * \param fb_y y-coordinate of the arc second focal point\r
+ * \param cw if 1, the arc will be clockwise, otherwise counter-clockwise.\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_arc_to(GF_Path *gp, Fixed end_x, Fixed end_y, Fixed fa_x, Fixed fa_y, Fixed fb_x, Fixed fb_y, Bool cw);\r
+/*!\r
+ * \brief adds arc as described in SVG to path\r
+ *\r
+ * Adds an arc contour to the path from end point, radii and 3 parameters.\r
+ * \param gp the target path\r
+ * \param end_x x-coordinate of the arc end point\r
+ * \param end_y y-coordinate of the arc end point\r
+ * \param r_x x-axis radius\r
+ * \param r_y y-axis radius \r
+ * \param x_axis_rotation angle for the x-axis\r
+ * \param large_arc_flag large or short arc selection\r
+ * \param sweep_flag if 1, the arc will be clockwise, otherwise counter-clockwise.\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_svg_arc_to(GF_Path *gp, Fixed end_x, Fixed end_y, Fixed r_x, Fixed r_y, Fixed x_axis_rotation, Bool large_arc_flag, Bool sweep_flag);\r
+/*!\r
+ * \brief adds arc to path\r
+ *\r
+ * Adds an arc contour to the path.\r
+ * \param gp the target path\r
+ * \param radius radius of the arc \r
+ * \param start_angle start angle of the arc in radians\r
+ * \param end_angle end angle of the arc in radians\r
+ * \param close_type closing type: 0 for open arc, 1 for close arc, 2 for pie\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_arc(GF_Path *gp, Fixed radius, Fixed start_angle, Fixed end_angle, u32 close_type);\r
+\r
+/*!\r
+ * \brief concatenates path\r
+ *\r
+ * Adds a sub-path to the path with a given transform.\r
+ * \param gp the target path\r
+ * \param subpath the path to add\r
+ * \param mat Matrix for subpath \r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_add_subpath(GF_Path *gp, GF_Path *subpath, GF_Matrix2D *mx);\r
+/*!\r
+ * \brief gets path control bounds\r
+ *\r
+ * Gets the path control bounds, i.e. the rectangle covering all lineTo and bezier control points.\r
+ * \param gp the target path\r
+ * \param rc pointer to rectangle receiving the control rectangle\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_get_control_bounds(GF_Path *gp, GF_Rect *rc);\r
+/*!\r
+ * \brief gets path bounds\r
+ *\r
+ * Gets the path bounds, i.e. the rectangle covering all points in path except bezier control points.\r
+ * \param gp the target path\r
+ * \param rc pointer to rectangle receiving the control rectangle\r
+ * \return error code if any error, \ref GF_OK otherwise\r
+ */\r
+GF_Err gf_path_get_bounds(GF_Path *gp, GF_Rect *rc);\r
+/*!\r
+ * \brief flattens path \r
+ *\r
+ * Flattens the path, i.e. transform all bezier curves to lines according to the path flatness.\r
+ * \param gp the target path\r
+ */\r
+void gf_path_flatten(GF_Path *gp);\r
+/*!\r
+ * \brief gets flatten copy of path \r
+ *\r
+ * Gets a flatten copy of the path.\r
+ * \param gp the target path\r
+ * \return the flatten path\r
+ */\r
+GF_Path *gf_path_get_flatten(GF_Path *gp);\r
+/*!\r
+ * \brief point over path testing\r
+ *\r
+ * Tests if a point is over a path or not, according to the path filling rule.\r
+ * \param gp the target path\r
+ * \param x x-coordinate of the point to check\r
+ * \param y y-coordinate of the point to check\r
+ * \return 1 if the point is over the path, 0 otherwise.\r
+ */\r
+Bool gf_path_point_over(GF_Path *gp, Fixed x, Fixed y);\r
+\r
+/*!\r
+ * \brief path init testing\r
+ *\r
+ * Tests if the path is empty or not.\r
+ * \param gp the target path\r
+ * \return 1 if the path is empty, 0 otherwise.\r
+ */\r
+Bool gf_path_is_empty(GF_Path *gp);\r
+\r
+/*!\r
+ * \brief path iterator \r
+ *\r
+ * The path iterator object is used to compute the length of a given path as well\r
+ * as transformation matrices along this path.\r
+ */\r
+typedef struct _path_iterator GF_PathIterator;\r
+\r
+/*!\r
+ * \brief path iterator constructor\r
+ *\r
+ * Creates a new path iterator from a given path\r
+ * \param gp the target path\r
+ * \return the path iterator object.\r
+ */\r
+GF_PathIterator *gf_path_iterator_new(GF_Path *gp);\r
+/*!\r
+ * \brief path iterator destructor\r
+ *\r
+ * Destructs the path iterator object\r
+ * \param it the target path iterator\r
+ */\r
+void gf_path_iterator_del(GF_PathIterator *it);\r
+\r
+/*!\r
+ * \brief get path length\r
+ *\r
+ * Gets a path length from its iterator\r
+ * \param it the target path iterator\r
+ * \return the length of the path\r
+ */\r
+Fixed gf_path_iterator_get_length(GF_PathIterator *it);\r
+/*!\r
+ *\brief gets transformation matrix at given point on path\r
+ *\r
+ * Gets the transformation of a given point on the path, given by offset from origin. \r
+ *The transform is so that a local system is translated to the given point, its x-axis tangent \r
+ *to the path and in the same direction. The path direction is from first point to last point\r
+ *of the path.\r
+ * \param it the target path iterator\r
+ * \param offset length on the path in local system unit\r
+ * \param follow_tangent indicates if transformation shall be computed if offset indicates a point outside the path (<0 or >path_length). In which case the path shall be virtually extended by the tangent at origin (offset <0) or at end (offset>path_length). Otherwise the transformation is not computed and 0 is returned.\r
+ * \param mat matrix to be transformed (transformation shall be appended) - the matrix shall not be initialized\r
+ * \param smooth_edges indicates if discontinuities shall be smoothed. If not set, the rotation angle THETA is the slope (DX/DY) of the current segment found.\r
+ * \param length_after_point if set and smooth_edges is set, the amount of the object that lies on next segment shall be computed according to length_after_point. \r
+ \code\r
+ Let:\r
+ len_last: length of current checked segment\r
+ len1: length of all previous segments so that len1 + len_last >= offset then if (offset + length_after_point > len1 + len_last) {\r
+ ratio = (len1 + len_last - offset) / length_after_point;\r
+ then THETA = ratio * slope(L1) + (1-ratio) * slope(L2)\r
+\r
+ Of course care must be taken for PI/2 angles and similar situations \r
+ \endcode\r
+\r
+ * \return 1 if matrix has been updated, 0 otherwise, if failure or if point is out of path without tangent extension.\r
+ */\r
+Bool gf_path_iterator_get_transform(GF_PathIterator *it, Fixed offset, Bool follow_tangent, GF_Matrix2D *mat, Bool smooth_edges, Fixed length_after_point);\r
+\r
+\r
+\r
+/*! brief gets convexity type for a 2D polygon\r
+ *\r
+ * Gets the convexity type of the given 2D polygon\r
+ * \param pts the points of the polygon\r
+ * \param nb_pts number of points in the polygon\r
+ * \return the convexity type of the polygon\r
+*/\r
+u32 gf_polygone2d_get_convexity(GF_Point2D *pts, u32 nb_pts);\r
+\r
+\r
+/* 2D Path constants */\r
+\r
+/*!\r
+ *2D Path point tags\r
+ * \hideinitializer\r
+ */\r
+enum\r
+{\r
+ /*/! Point is on curve (moveTo, lineTo, end of splines)*/\r
+ GF_PATH_CURVE_ON = 1,\r
+ /*! Point is a contour close*/\r
+ GF_PATH_CLOSE = 5,\r
+ /*! Point is a quadratic control point*/\r
+ GF_PATH_CURVE_CONIC = 0,\r
+ /*! Point is a cubic control point*/\r
+ GF_PATH_CURVE_CUBIC = 2,\r
+};\r
+\r
+\r
+/*!\r
+ *2D Path flags\r
+ * \hideinitializer\r
+ */\r
+enum\r
+{\r
+ /*! Path is filled using the zero-nonzero rule. If not set, filling uses odd/even rule*/\r
+ GF_PATH_FILL_ZERO_NONZERO = 1,\r
+ /*! When set bbox must be recomputed. \r
+ \note Read only, used to avoid wasting time on bounds calculation*/\r
+ GF_PATH_BBOX_DIRTY = 2,\r
+ /*! Indicates the path is flattened flattened\r
+ \note Read only, used to avoid wasting time on flattening*/\r
+ GF_PATH_FLATTENED = 4,\r
+};\r
+\r
+/*!\r
+ * 2D Polygon convexity type\r
+ * \hideinitializer\r
+ */\r
+enum\r
+{\r
+ /*! Polygon is either complex or unknown*/\r
+ GF_POLYGON_COMPLEX,\r
+ /*! Polygon is complex, starting in counter-clockwise order*/\r
+ GF_POLYGON_COMPLEX_CCW,\r
+ /*! Polygon is complex, starting in clockwise order*/\r
+ GF_POLYGON_COMPLEX_CW,\r
+ /*! Polygon is a counter-clockwise convex polygon*/\r
+ GF_POLYGON_CONVEX_CCW,\r
+ /*! Polygon is a clockwise convex polygon*/\r
+ GF_POLYGON_CONVEX_CW,\r
+ /*! Polygon is a convex line (degenerated path with all segments aligned)*/\r
+ GF_POLYGON_CONVEX_LINE\r
+};\r
+\r
+/*!\r
+ * Stencil alignment type for outlining\r
+ * \hideinitializer\r
+ */\r
+enum\r
+{ \r
+ /*! outline is centered on the path (default)*/\r
+ GF_PATH_LINE_CENTER = 0,\r
+ /*! outline is inside the path*/\r
+ GF_PATH_LINE_INSIDE,\r
+ /*! outline is outside the path*/\r
+ GF_PATH_LINE_OUTSIDE,\r
+};\r
+\r
+/*!\r
+ * Line cap type for outlining\r
+ * \hideinitializer\r
+ */\r
+enum\r
+{\r
+ /*! End of line is flat (default)*/\r
+ GF_LINE_CAP_FLAT = 0,\r
+ /*! End of line is round*/\r
+ GF_LINE_CAP_ROUND,\r
+ /*! End of line is square*/\r
+ GF_LINE_CAP_SQUARE,\r
+ /*! End of line is triangle*/\r
+ GF_LINE_CAP_TRIANGLE,\r
+};\r
+\r
+/*!\r
+ * Line join type for outlining\r
+ * \hideinitializer\r
+ */\r
+enum\r
+{\r
+ /*! Line join is a miter join (default)*/\r
+ GF_LINE_JOIN_MITER = 0,\r
+ /*! Line join is a round join*/\r
+ GF_LINE_JOIN_ROUND,\r
+ /*! Line join is a bevel join*/\r
+ GF_LINE_JOIN_BEVEL,\r
+ /*! Line join is a miter then bevel join*/\r
+ GF_LINE_JOIN_MITER_SVG\r
+};\r
+\r
+/*!\r
+ * Dash types for outlining\r
+ * \hideinitializer\r
+ */\r
+enum\r
+{\r
+ /*! No dashing is used (default)*/\r
+ GF_DASH_STYLE_PLAIN = 0,\r
+ /*! Predefined dash pattern is used*/\r
+ GF_DASH_STYLE_DASH,\r
+ /*! Predefined dot pattern is used*/\r
+ GF_DASH_STYLE_DOT,\r
+ /*! Predefined dash-dot pattern is used*/\r
+ GF_DASH_STYLE_DASH_DOT,\r
+ /*! Predefined dash-dash-dot pattern is used*/\r
+ GF_DASH_STYLE_DASH_DASH_DOT,\r
+ /*! Predefined dash-dot-dot pattern is used*/\r
+ GF_DASH_STYLE_DASH_DOT_DOT,\r
+ /*! Custom pattern is used. Dash lengths are given in percentage of the pen width*/\r
+ GF_DASH_STYLE_CUSTOM,\r
+ /*! SVG pattern is used. Dash lengths are given in the same unit as the pen width\r
+ and dash offset follows SVG specs (offset in dash pattern)*/\r
+ GF_DASH_STYLE_SVG,\r
+};\r
+\r
+\r
+/*!\brief Custom dash pattern\r
+ *\r
+ *The custom dash pattern object is used to specify custom dashes when outlining a path.\r
+ */\r
+typedef struct\r
+{\r
+ /*! Number of dashes in the pattern*/\r
+ u32 num_dash;\r
+ /*! Value of the pattern dashes. Unit depends on the dash type*/\r
+ Fixed *dashes;\r
+} GF_DashSettings;\r
+\r
+/*!\brief Pen properties \r
+ *\r
+ *The pen properties object is used to specify several parameters used when building\r
+ *the vectorial outline of a path.\r
+ */\r
+typedef struct\r
+{\r
+ /*! The width of the outline*/\r
+ Fixed width;\r
+ /*! The style of the lines ends*/\r
+ u8 cap;\r
+ /*! The style of the lines joins*/\r
+ u8 join;\r
+ /*! The alignment of the outline with regard to the path*/\r
+ u8 align;\r
+ /*! The dash style of the line*/\r
+ u8 dash;\r
+ /*! The miter limit of the line joins*/\r
+ Fixed miterLimit;\r
+ /*! The initial dash offset in the outline. All points before this offset will be \r
+ * ignored when building the outline*/\r
+ Fixed dash_offset;\r
+ /*! The dash pattern used for curstom dashing*/\r
+ GF_DashSettings *dash_set;\r
+ /*! The author-specified path length. Ignored if <= 0*/\r
+ Fixed path_length;\r
+} GF_PenSettings;\r
+\r
+/*! brief builds the vectorial outline of a path\r
+ *\r
+ * Builds the vectorial outline of a path for the given settings. The outline of a path is a path.\r
+ * \param path the desired path to outline\r
+ * \param pen the properties of the virtual pen used for outlining\r
+ * \return the outline of the path \r
+*/\r
+GF_Path *gf_path_get_outline(GF_Path *path, GF_PenSettings pen);\r
+\r
+\r
+/*! @} */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+\r
+#endif /*_GF_PATH2D_H_*/\r
+\r