michael@0: /***************************************************************************/ michael@0: /* */ michael@0: /* ftstroke.h */ michael@0: /* */ michael@0: /* FreeType path stroker (specification). */ michael@0: /* */ michael@0: /* Copyright 2002-2006, 2008, 2009, 2011-2012 by */ michael@0: /* David Turner, Robert Wilhelm, and Werner Lemberg. */ michael@0: /* */ michael@0: /* This file is part of the FreeType project, and may only be used, */ michael@0: /* modified, and distributed under the terms of the FreeType project */ michael@0: /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ michael@0: /* this file you indicate that you have read the license and */ michael@0: /* understand and accept it fully. */ michael@0: /* */ michael@0: /***************************************************************************/ michael@0: michael@0: michael@0: #ifndef __FT_STROKE_H__ michael@0: #define __FT_STROKE_H__ michael@0: michael@0: #include michael@0: #include FT_OUTLINE_H michael@0: #include FT_GLYPH_H michael@0: michael@0: michael@0: FT_BEGIN_HEADER michael@0: michael@0: michael@0: /************************************************************************ michael@0: * michael@0: * @section: michael@0: * glyph_stroker michael@0: * michael@0: * @title: michael@0: * Glyph Stroker michael@0: * michael@0: * @abstract: michael@0: * Generating bordered and stroked glyphs. michael@0: * michael@0: * @description: michael@0: * This component generates stroked outlines of a given vectorial michael@0: * glyph. It also allows you to retrieve the `outside' and/or the michael@0: * `inside' borders of the stroke. michael@0: * michael@0: * This can be useful to generate `bordered' glyph, i.e., glyphs michael@0: * displayed with a coloured (and anti-aliased) border around their michael@0: * shape. michael@0: */ michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @type: michael@0: * FT_Stroker michael@0: * michael@0: * @description: michael@0: * Opaque handler to a path stroker object. michael@0: */ michael@0: typedef struct FT_StrokerRec_* FT_Stroker; michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @enum: michael@0: * FT_Stroker_LineJoin michael@0: * michael@0: * @description: michael@0: * These values determine how two joining lines are rendered michael@0: * in a stroker. michael@0: * michael@0: * @values: michael@0: * FT_STROKER_LINEJOIN_ROUND :: michael@0: * Used to render rounded line joins. Circular arcs are used michael@0: * to join two lines smoothly. michael@0: * michael@0: * FT_STROKER_LINEJOIN_BEVEL :: michael@0: * Used to render beveled line joins. The outer corner of michael@0: * the joined lines is filled by enclosing the triangular michael@0: * region of the corner with a straight line between the michael@0: * outer corners of each stroke. michael@0: * michael@0: * FT_STROKER_LINEJOIN_MITER_FIXED :: michael@0: * Used to render mitered line joins, with fixed bevels if the michael@0: * miter limit is exceeded. The outer edges of the strokes michael@0: * for the two segments are extended until they meet at an michael@0: * angle. If the segments meet at too sharp an angle (such michael@0: * that the miter would extend from the intersection of the michael@0: * segments a distance greater than the product of the miter michael@0: * limit value and the border radius), then a bevel join (see michael@0: * above) is used instead. This prevents long spikes being michael@0: * created. FT_STROKER_LINEJOIN_MITER_FIXED generates a miter michael@0: * line join as used in PostScript and PDF. michael@0: * michael@0: * FT_STROKER_LINEJOIN_MITER_VARIABLE :: michael@0: * FT_STROKER_LINEJOIN_MITER :: michael@0: * Used to render mitered line joins, with variable bevels if michael@0: * the miter limit is exceeded. The intersection of the michael@0: * strokes is clipped at a line perpendicular to the bisector michael@0: * of the angle between the strokes, at the distance from the michael@0: * intersection of the segments equal to the product of the michael@0: * miter limit value and the border radius. This prevents michael@0: * long spikes being created. michael@0: * FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line michael@0: * join as used in XPS. FT_STROKER_LINEJOIN_MITER is an alias michael@0: * for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for michael@0: * backwards compatibility. michael@0: */ michael@0: typedef enum FT_Stroker_LineJoin_ michael@0: { michael@0: FT_STROKER_LINEJOIN_ROUND = 0, michael@0: FT_STROKER_LINEJOIN_BEVEL = 1, michael@0: FT_STROKER_LINEJOIN_MITER_VARIABLE = 2, michael@0: FT_STROKER_LINEJOIN_MITER = FT_STROKER_LINEJOIN_MITER_VARIABLE, michael@0: FT_STROKER_LINEJOIN_MITER_FIXED = 3 michael@0: michael@0: } FT_Stroker_LineJoin; michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @enum: michael@0: * FT_Stroker_LineCap michael@0: * michael@0: * @description: michael@0: * These values determine how the end of opened sub-paths are michael@0: * rendered in a stroke. michael@0: * michael@0: * @values: michael@0: * FT_STROKER_LINECAP_BUTT :: michael@0: * The end of lines is rendered as a full stop on the last michael@0: * point itself. michael@0: * michael@0: * FT_STROKER_LINECAP_ROUND :: michael@0: * The end of lines is rendered as a half-circle around the michael@0: * last point. michael@0: * michael@0: * FT_STROKER_LINECAP_SQUARE :: michael@0: * The end of lines is rendered as a square around the michael@0: * last point. michael@0: */ michael@0: typedef enum FT_Stroker_LineCap_ michael@0: { michael@0: FT_STROKER_LINECAP_BUTT = 0, michael@0: FT_STROKER_LINECAP_ROUND, michael@0: FT_STROKER_LINECAP_SQUARE michael@0: michael@0: } FT_Stroker_LineCap; michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @enum: michael@0: * FT_StrokerBorder michael@0: * michael@0: * @description: michael@0: * These values are used to select a given stroke border michael@0: * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. michael@0: * michael@0: * @values: michael@0: * FT_STROKER_BORDER_LEFT :: michael@0: * Select the left border, relative to the drawing direction. michael@0: * michael@0: * FT_STROKER_BORDER_RIGHT :: michael@0: * Select the right border, relative to the drawing direction. michael@0: * michael@0: * @note: michael@0: * Applications are generally interested in the `inside' and `outside' michael@0: * borders. However, there is no direct mapping between these and the michael@0: * `left' and `right' ones, since this really depends on the glyph's michael@0: * drawing orientation, which varies between font formats. michael@0: * michael@0: * You can however use @FT_Outline_GetInsideBorder and michael@0: * @FT_Outline_GetOutsideBorder to get these. michael@0: */ michael@0: typedef enum FT_StrokerBorder_ michael@0: { michael@0: FT_STROKER_BORDER_LEFT = 0, michael@0: FT_STROKER_BORDER_RIGHT michael@0: michael@0: } FT_StrokerBorder; michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Outline_GetInsideBorder michael@0: * michael@0: * @description: michael@0: * Retrieve the @FT_StrokerBorder value corresponding to the michael@0: * `inside' borders of a given outline. michael@0: * michael@0: * @input: michael@0: * outline :: michael@0: * The source outline handle. michael@0: * michael@0: * @return: michael@0: * The border index. @FT_STROKER_BORDER_RIGHT for empty or invalid michael@0: * outlines. michael@0: */ michael@0: FT_EXPORT( FT_StrokerBorder ) michael@0: FT_Outline_GetInsideBorder( FT_Outline* outline ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Outline_GetOutsideBorder michael@0: * michael@0: * @description: michael@0: * Retrieve the @FT_StrokerBorder value corresponding to the michael@0: * `outside' borders of a given outline. michael@0: * michael@0: * @input: michael@0: * outline :: michael@0: * The source outline handle. michael@0: * michael@0: * @return: michael@0: * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid michael@0: * outlines. michael@0: */ michael@0: FT_EXPORT( FT_StrokerBorder ) michael@0: FT_Outline_GetOutsideBorder( FT_Outline* outline ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_New michael@0: * michael@0: * @description: michael@0: * Create a new stroker object. michael@0: * michael@0: * @input: michael@0: * library :: michael@0: * FreeType library handle. michael@0: * michael@0: * @output: michael@0: * astroker :: michael@0: * A new stroker object handle. NULL in case of error. michael@0: * michael@0: * @return: michael@0: * FreeType error code. 0~means success. michael@0: */ michael@0: FT_EXPORT( FT_Error ) michael@0: FT_Stroker_New( FT_Library library, michael@0: FT_Stroker *astroker ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_Set michael@0: * michael@0: * @description: michael@0: * Reset a stroker object's attributes. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: * michael@0: * radius :: michael@0: * The border radius. michael@0: * michael@0: * line_cap :: michael@0: * The line cap style. michael@0: * michael@0: * line_join :: michael@0: * The line join style. michael@0: * michael@0: * miter_limit :: michael@0: * The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and michael@0: * FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles, michael@0: * expressed as 16.16 fixed-point value. michael@0: * michael@0: * @note: michael@0: * The radius is expressed in the same units as the outline michael@0: * coordinates. michael@0: */ michael@0: FT_EXPORT( void ) michael@0: FT_Stroker_Set( FT_Stroker stroker, michael@0: FT_Fixed radius, michael@0: FT_Stroker_LineCap line_cap, michael@0: FT_Stroker_LineJoin line_join, michael@0: FT_Fixed miter_limit ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_Rewind michael@0: * michael@0: * @description: michael@0: * Reset a stroker object without changing its attributes. michael@0: * You should call this function before beginning a new michael@0: * series of calls to @FT_Stroker_BeginSubPath or michael@0: * @FT_Stroker_EndSubPath. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: */ michael@0: FT_EXPORT( void ) michael@0: FT_Stroker_Rewind( FT_Stroker stroker ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_ParseOutline michael@0: * michael@0: * @description: michael@0: * A convenience function used to parse a whole outline with michael@0: * the stroker. The resulting outline(s) can be retrieved michael@0: * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: * michael@0: * outline :: michael@0: * The source outline. michael@0: * michael@0: * opened :: michael@0: * A boolean. If~1, the outline is treated as an open path instead michael@0: * of a closed one. michael@0: * michael@0: * @return: michael@0: * FreeType error code. 0~means success. michael@0: * michael@0: * @note: michael@0: * If `opened' is~0 (the default), the outline is treated as a closed michael@0: * path, and the stroker generates two distinct `border' outlines. michael@0: * michael@0: * If `opened' is~1, the outline is processed as an open path, and the michael@0: * stroker generates a single `stroke' outline. michael@0: * michael@0: * This function calls @FT_Stroker_Rewind automatically. michael@0: */ michael@0: FT_EXPORT( FT_Error ) michael@0: FT_Stroker_ParseOutline( FT_Stroker stroker, michael@0: FT_Outline* outline, michael@0: FT_Bool opened ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_BeginSubPath michael@0: * michael@0: * @description: michael@0: * Start a new sub-path in the stroker. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: * michael@0: * to :: michael@0: * A pointer to the start vector. michael@0: * michael@0: * open :: michael@0: * A boolean. If~1, the sub-path is treated as an open one. michael@0: * michael@0: * @return: michael@0: * FreeType error code. 0~means success. michael@0: * michael@0: * @note: michael@0: * This function is useful when you need to stroke a path that is michael@0: * not stored as an @FT_Outline object. michael@0: */ michael@0: FT_EXPORT( FT_Error ) michael@0: FT_Stroker_BeginSubPath( FT_Stroker stroker, michael@0: FT_Vector* to, michael@0: FT_Bool open ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_EndSubPath michael@0: * michael@0: * @description: michael@0: * Close the current sub-path in the stroker. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: * michael@0: * @return: michael@0: * FreeType error code. 0~means success. michael@0: * michael@0: * @note: michael@0: * You should call this function after @FT_Stroker_BeginSubPath. michael@0: * If the subpath was not `opened', this function `draws' a michael@0: * single line segment to the start position when needed. michael@0: */ michael@0: FT_EXPORT( FT_Error ) michael@0: FT_Stroker_EndSubPath( FT_Stroker stroker ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_LineTo michael@0: * michael@0: * @description: michael@0: * `Draw' a single line segment in the stroker's current sub-path, michael@0: * from the last position. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: * michael@0: * to :: michael@0: * A pointer to the destination point. michael@0: * michael@0: * @return: michael@0: * FreeType error code. 0~means success. michael@0: * michael@0: * @note: michael@0: * You should call this function between @FT_Stroker_BeginSubPath and michael@0: * @FT_Stroker_EndSubPath. michael@0: */ michael@0: FT_EXPORT( FT_Error ) michael@0: FT_Stroker_LineTo( FT_Stroker stroker, michael@0: FT_Vector* to ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_ConicTo michael@0: * michael@0: * @description: michael@0: * `Draw' a single quadratic Bézier in the stroker's current sub-path, michael@0: * from the last position. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: * michael@0: * control :: michael@0: * A pointer to a Bézier control point. michael@0: * michael@0: * to :: michael@0: * A pointer to the destination point. michael@0: * michael@0: * @return: michael@0: * FreeType error code. 0~means success. michael@0: * michael@0: * @note: michael@0: * You should call this function between @FT_Stroker_BeginSubPath and michael@0: * @FT_Stroker_EndSubPath. michael@0: */ michael@0: FT_EXPORT( FT_Error ) michael@0: FT_Stroker_ConicTo( FT_Stroker stroker, michael@0: FT_Vector* control, michael@0: FT_Vector* to ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_CubicTo michael@0: * michael@0: * @description: michael@0: * `Draw' a single cubic Bézier in the stroker's current sub-path, michael@0: * from the last position. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: * michael@0: * control1 :: michael@0: * A pointer to the first Bézier control point. michael@0: * michael@0: * control2 :: michael@0: * A pointer to second Bézier control point. michael@0: * michael@0: * to :: michael@0: * A pointer to the destination point. michael@0: * michael@0: * @return: michael@0: * FreeType error code. 0~means success. michael@0: * michael@0: * @note: michael@0: * You should call this function between @FT_Stroker_BeginSubPath and michael@0: * @FT_Stroker_EndSubPath. michael@0: */ michael@0: FT_EXPORT( FT_Error ) michael@0: FT_Stroker_CubicTo( FT_Stroker stroker, michael@0: FT_Vector* control1, michael@0: FT_Vector* control2, michael@0: FT_Vector* to ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_GetBorderCounts michael@0: * michael@0: * @description: michael@0: * Call this function once you have finished parsing your paths michael@0: * with the stroker. It returns the number of points and michael@0: * contours necessary to export one of the `border' or `stroke' michael@0: * outlines generated by the stroker. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: * michael@0: * border :: michael@0: * The border index. michael@0: * michael@0: * @output: michael@0: * anum_points :: michael@0: * The number of points. michael@0: * michael@0: * anum_contours :: michael@0: * The number of contours. michael@0: * michael@0: * @return: michael@0: * FreeType error code. 0~means success. michael@0: * michael@0: * @note: michael@0: * When an outline, or a sub-path, is `closed', the stroker generates michael@0: * two independent `border' outlines, named `left' and `right'. michael@0: * michael@0: * When the outline, or a sub-path, is `opened', the stroker merges michael@0: * the `border' outlines with caps. The `left' border receives all michael@0: * points, while the `right' border becomes empty. michael@0: * michael@0: * Use the function @FT_Stroker_GetCounts instead if you want to michael@0: * retrieve the counts associated to both borders. michael@0: */ michael@0: FT_EXPORT( FT_Error ) michael@0: FT_Stroker_GetBorderCounts( FT_Stroker stroker, michael@0: FT_StrokerBorder border, michael@0: FT_UInt *anum_points, michael@0: FT_UInt *anum_contours ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_ExportBorder michael@0: * michael@0: * @description: michael@0: * Call this function after @FT_Stroker_GetBorderCounts to michael@0: * export the corresponding border to your own @FT_Outline michael@0: * structure. michael@0: * michael@0: * Note that this function appends the border points and michael@0: * contours to your outline, but does not try to resize its michael@0: * arrays. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: * michael@0: * border :: michael@0: * The border index. michael@0: * michael@0: * outline :: michael@0: * The target outline handle. michael@0: * michael@0: * @note: michael@0: * Always call this function after @FT_Stroker_GetBorderCounts to michael@0: * get sure that there is enough room in your @FT_Outline object to michael@0: * receive all new data. michael@0: * michael@0: * When an outline, or a sub-path, is `closed', the stroker generates michael@0: * two independent `border' outlines, named `left' and `right' michael@0: * michael@0: * When the outline, or a sub-path, is `opened', the stroker merges michael@0: * the `border' outlines with caps. The `left' border receives all michael@0: * points, while the `right' border becomes empty. michael@0: * michael@0: * Use the function @FT_Stroker_Export instead if you want to michael@0: * retrieve all borders at once. michael@0: */ michael@0: FT_EXPORT( void ) michael@0: FT_Stroker_ExportBorder( FT_Stroker stroker, michael@0: FT_StrokerBorder border, michael@0: FT_Outline* outline ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_GetCounts michael@0: * michael@0: * @description: michael@0: * Call this function once you have finished parsing your paths michael@0: * with the stroker. It returns the number of points and michael@0: * contours necessary to export all points/borders from the stroked michael@0: * outline/path. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: * michael@0: * @output: michael@0: * anum_points :: michael@0: * The number of points. michael@0: * michael@0: * anum_contours :: michael@0: * The number of contours. michael@0: * michael@0: * @return: michael@0: * FreeType error code. 0~means success. michael@0: */ michael@0: FT_EXPORT( FT_Error ) michael@0: FT_Stroker_GetCounts( FT_Stroker stroker, michael@0: FT_UInt *anum_points, michael@0: FT_UInt *anum_contours ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_Export michael@0: * michael@0: * @description: michael@0: * Call this function after @FT_Stroker_GetBorderCounts to michael@0: * export all borders to your own @FT_Outline structure. michael@0: * michael@0: * Note that this function appends the border points and michael@0: * contours to your outline, but does not try to resize its michael@0: * arrays. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * The target stroker handle. michael@0: * michael@0: * outline :: michael@0: * The target outline handle. michael@0: */ michael@0: FT_EXPORT( void ) michael@0: FT_Stroker_Export( FT_Stroker stroker, michael@0: FT_Outline* outline ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Stroker_Done michael@0: * michael@0: * @description: michael@0: * Destroy a stroker object. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * A stroker handle. Can be NULL. michael@0: */ michael@0: FT_EXPORT( void ) michael@0: FT_Stroker_Done( FT_Stroker stroker ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Glyph_Stroke michael@0: * michael@0: * @description: michael@0: * Stroke a given outline glyph object with a given stroker. michael@0: * michael@0: * @inout: michael@0: * pglyph :: michael@0: * Source glyph handle on input, new glyph handle on output. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * A stroker handle. michael@0: * michael@0: * destroy :: michael@0: * A Boolean. If~1, the source glyph object is destroyed michael@0: * on success. michael@0: * michael@0: * @return: michael@0: * FreeType error code. 0~means success. michael@0: * michael@0: * @note: michael@0: * The source glyph is untouched in case of error. michael@0: * michael@0: * Adding stroke may yield a significantly wider and taller glyph michael@0: * depending on how large of a radius was used to stroke the glyph. You michael@0: * may need to manually adjust horizontal and vertical advance amounts michael@0: * to account for this added size. michael@0: */ michael@0: FT_EXPORT( FT_Error ) michael@0: FT_Glyph_Stroke( FT_Glyph *pglyph, michael@0: FT_Stroker stroker, michael@0: FT_Bool destroy ); michael@0: michael@0: michael@0: /************************************************************** michael@0: * michael@0: * @function: michael@0: * FT_Glyph_StrokeBorder michael@0: * michael@0: * @description: michael@0: * Stroke a given outline glyph object with a given stroker, but michael@0: * only return either its inside or outside border. michael@0: * michael@0: * @inout: michael@0: * pglyph :: michael@0: * Source glyph handle on input, new glyph handle on output. michael@0: * michael@0: * @input: michael@0: * stroker :: michael@0: * A stroker handle. michael@0: * michael@0: * inside :: michael@0: * A Boolean. If~1, return the inside border, otherwise michael@0: * the outside border. michael@0: * michael@0: * destroy :: michael@0: * A Boolean. If~1, the source glyph object is destroyed michael@0: * on success. michael@0: * michael@0: * @return: michael@0: * FreeType error code. 0~means success. michael@0: * michael@0: * @note: michael@0: * The source glyph is untouched in case of error. michael@0: * michael@0: * Adding stroke may yield a significantly wider and taller glyph michael@0: * depending on how large of a radius was used to stroke the glyph. You michael@0: * may need to manually adjust horizontal and vertical advance amounts michael@0: * to account for this added size. michael@0: */ michael@0: FT_EXPORT( FT_Error ) michael@0: FT_Glyph_StrokeBorder( FT_Glyph *pglyph, michael@0: FT_Stroker stroker, michael@0: FT_Bool inside, michael@0: FT_Bool destroy ); michael@0: michael@0: /* */ michael@0: michael@0: FT_END_HEADER michael@0: michael@0: #endif /* __FT_STROKE_H__ */ michael@0: michael@0: michael@0: /* END */ michael@0: michael@0: michael@0: /* Local Variables: */ michael@0: /* coding: utf-8 */ michael@0: /* End: */