{***************************************************************************} {* *} {* ftstroke.h *} {* *} {* FreeType path stroker (specification). *} {* *} {* Copyright 2002, 2003, 2004, 2005, 2006 by *} {* David Turner, Robert Wilhelm, and Werner Lemberg. *} {* *} {* This file is part of the FreeType project, and may only be used, *} {* modified, and distributed under the terms of the FreeType project *} {* license, LICENSE.TXT. By continuing to use, modify, or distribute *} {* this file you indicate that you have read the license and *} {* understand and accept it fully. *} {* *} {***************************************************************************} (***************************************************************************) (* Pascal port by the UltraStar Deluxe Team *) (***************************************************************************) {************************************************************************ * * @section: * glyph_stroker * * @title: * Glyph Stroker * * @abstract: * Generating bordered and stroked glyphs. * * @description: * This component generates stroked outlines of a given vectorial * glyph. It also allows you to retrieve the `outside' and/or the * `inside' borders of the stroke. * * This can be useful to generate `bordered' glyph, i.e., glyphs * displayed with a coloured (and anti-aliased) border around their * shape. *} {$IFDEF TYPE_DECL} {************************************************************** * * @type: * FT_Stroker * * @description: * Opaque handler to a path stroker object. *} FT_Stroker = Pointer; {************************************************************** * * @enum: * FT_Stroker_LineJoin * * @description: * These values determine how two joining lines are rendered * in a stroker. * * @values: * FT_STROKER_LINEJOIN_ROUND :: * Used to render rounded line joins. Circular arcs are used * to join two lines smoothly. * * FT_STROKER_LINEJOIN_BEVEL :: * Used to render beveled line joins; i.e., the two joining lines * are extended until they intersect. * * FT_STROKER_LINEJOIN_MITER :: * Same as beveled rendering, except that an additional line * break is added if the angle between the two joining lines * is too closed (this is useful to avoid unpleasant spikes * in beveled rendering). *} FT_Stroker_LineJoin = cint; {$ELSE TYPE_DECL} const FT_STROKER_LINEJOIN_ROUND = 0; FT_STROKER_LINEJOIN_BEVEL = 1; FT_STROKER_LINEJOIN_MITER = 2; {$ENDIF TYPE_DECL} {$IFDEF TYPE_DECL} {************************************************************** * * @enum: * FT_Stroker_LineCap * * @description: * These values determine how the end of opened sub-paths are * rendered in a stroke. * * @values: * FT_STROKER_LINECAP_BUTT :: * The end of lines is rendered as a full stop on the last * point itself. * * FT_STROKER_LINECAP_ROUND :: * The end of lines is rendered as a half-circle around the * last point. * * FT_STROKER_LINECAP_SQUARE :: * The end of lines is rendered as a square around the * last point. *} FT_Stroker_LineCap = cint; {$ELSE TYPE_DECL} const FT_STROKER_LINECAP_BUTT = 0; FT_STROKER_LINECAP_ROUND = 1; FT_STROKER_LINECAP_SQUARE = 2; {$ENDIF TYPE_DECL} {$IFDEF TYPE_DECL} {************************************************************** * * @enum: * FT_StrokerBorder * * @description: * These values are used to select a given stroke border * in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder. * * @values: * FT_STROKER_BORDER_LEFT :: * Select the left border, relative to the drawing direction. * * FT_STROKER_BORDER_RIGHT :: * Select the right border, relative to the drawing direction. * * @note: * Applications are generally interested in the `inside' and `outside' * borders. However, there is no direct mapping between these and the * `left' and `right' ones, since this really depends on the glyph's * drawing orientation, which varies between font formats. * * You can however use @FT_Outline_GetInsideBorder and * @FT_Outline_GetOutsideBorder to get these. *} FT_StrokerBorder = cint; {$ELSE TYPE_DECL} const FT_STROKER_BORDER_LEFT = 0; FT_STROKER_BORDER_RIGHT = 1; {************************************************************** * * @function: * FT_Outline_GetInsideBorder * * @description: * Retrieve the @FT_StrokerBorder value corresponding to the * `inside' borders of a given outline. * * @input: * outline :: * The source outline handle. * * @return: * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid * outlines. *} function FT_Outline_GetInsideBorder( outline: PFT_Outline ): FT_StrokerBorder; cdecl; external ft_lib name 'FT_Outline_GetInsideBorder'; {************************************************************** * * @function: * FT_Outline_GetOutsideBorder * * @description: * Retrieve the @FT_StrokerBorder value corresponding to the * `outside' borders of a given outline. * * @input: * outline :: * The source outline handle. * * @return: * The border index. @FT_STROKER_BORDER_LEFT for empty or invalid * outlines. *} function FT_Outline_GetOutsideBorder( outline: PFT_Outline ): FT_StrokerBorder; cdecl; external ft_lib name 'FT_Outline_GetOutsideBorder'; {************************************************************** * * @function: * FT_Stroker_New * * @description: * Create a new stroker object. * * @input: * library :: * FreeType library handle. * * @output: * astroker :: * A new stroker object handle. NULL in case of error. * * @return: * FreeType error code. 0 means success. *} function FT_Stroker_New( library_: FT_Library; out astroker: FT_Stroker ): FT_Error; cdecl; external ft_lib name 'FT_Stroker_New'; {************************************************************** * * @function: * FT_Stroker_Set * * @description: * Reset a stroker object's attributes. * * @input: * stroker :: * The target stroker handle. * * radius :: * The border radius. * * line_cap :: * The line cap style. * * line_join :: * The line join style. * * miter_limit :: * The miter limit for the FT_STROKER_LINEJOIN_MITER style, * expressed as 16.16 fixed point value. * * @note: * The radius is expressed in the same units that the outline * coordinates. *} procedure FT_Stroker_Set( stroker: FT_Stroker; radius: FT_Fixed; line_cap: FT_Stroker_LineCap; line_join: FT_Stroker_LineJoin; miter_limit: FT_Fixed ); cdecl; external ft_lib name 'FT_Stroker_Set'; {************************************************************** * * @function: * FT_Stroker_Rewind * * @description: * Reset a stroker object without changing its attributes. * You should call this function before beginning a new * series of calls to @FT_Stroker_BeginSubPath or * @FT_Stroker_EndSubPath. * * @input: * stroker :: * The target stroker handle. *} procedure FT_Stroker_Rewind( stroker: FT_Stroker ); cdecl; external ft_lib name 'FT_Stroker_Rewind'; {************************************************************** * * @function: * FT_Stroker_ParseOutline * * @description: * A convenience function used to parse a whole outline with * the stroker. The resulting outline(s) can be retrieved * later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export. * * @input: * stroker :: * The target stroker handle. * * outline :: * The source outline. * * opened :: * A boolean. If 1, the outline is treated as an open path instead * of a closed one. * * @return: * FreeType error code. 0 means success. * * @note: * If `opened' is 0 (the default), the outline is treated as a closed * path, and the stroker will generate two distinct `border' outlines. * * If `opened' is 1, the outline is processed as an open path, and the * stroker will generate a single `stroke' outline. * * This function calls @FT_Stroker_Rewind automatically. *} function FT_Stroker_ParseOutline( stroker: FT_Stroker; outline: PFT_Outline; opened: FT_Bool): FT_Error; cdecl; external ft_lib name 'FT_Stroker_ParseOutline'; {************************************************************** * * @function: * FT_Stroker_BeginSubPath * * @description: * Start a new sub-path in the stroker. * * @input: * stroker :: * The target stroker handle. * * to :: * A pointer to the start vector. * * open :: * A boolean. If 1, the sub-path is treated as an open one. * * @return: * FreeType error code. 0 means success. * * @note: * This function is useful when you need to stroke a path that is * not stored as an @FT_Outline object. *} function FT_Stroker_BeginSubPath( stroker: FT_Stroker; to_: PFT_Vector; open: FT_Bool ): FT_Error; cdecl; external ft_lib name 'FT_Stroker_BeginSubPath'; {************************************************************** * * @function: * FT_Stroker_EndSubPath * * @description: * Close the current sub-path in the stroker. * * @input: * stroker :: * The target stroker handle. * * @return: * FreeType error code. 0 means success. * * @note: * You should call this function after @FT_Stroker_BeginSubPath. * If the subpath was not `opened', this function will `draw' a * single line segment to the start position when needed. *} function FT_Stroker_EndSubPath( stroker: FT_Stroker ): FT_Error; cdecl; external ft_lib name 'FT_Stroker_EndSubPath'; {************************************************************** * * @function: * FT_Stroker_LineTo * * @description: * `Draw' a single line segment in the stroker's current sub-path, * from the last position. * * @input: * stroker :: * The target stroker handle. * * to :: * A pointer to the destination point. * * @return: * FreeType error code. 0 means success. * * @note: * You should call this function between @FT_Stroker_BeginSubPath and * @FT_Stroker_EndSubPath. *} function FT_Stroker_LineTo( stroker: FT_Stroker; to_: PFT_Vector ): FT_Error; cdecl; external ft_lib name 'FT_Stroker_LineTo'; {************************************************************** * * @function: * FT_Stroker_ConicTo * * @description: * `Draw' a single quadratic Bézier in the stroker's current sub-path, * from the last position. * * @input: * stroker :: * The target stroker handle. * * control :: * A pointer to a Bézier control point. * * to :: * A pointer to the destination point. * * @return: * FreeType error code. 0 means success. * * @note: * You should call this function between @FT_Stroker_BeginSubPath and * @FT_Stroker_EndSubPath. *} function FT_Stroker_ConicTo( stroker: FT_Stroker; control: PFT_Vector; to_: PFT_Vector ): FT_Error; cdecl; external ft_lib name 'FT_Stroker_ConicTo'; {************************************************************** * * @function: * FT_Stroker_CubicTo * * @description: * `Draw' a single cubic Bézier in the stroker's current sub-path, * from the last position. * * @input: * stroker :: * The target stroker handle. * * control1 :: * A pointer to the first Bézier control point. * * control2 :: * A pointer to second Bézier control point. * * to :: * A pointer to the destination point. * * @return: * FreeType error code. 0 means success. * * @note: * You should call this function between @FT_Stroker_BeginSubPath and * @FT_Stroker_EndSubPath. *} function FT_Stroker_CubicTo( stroker: FT_Stroker; control1: PFT_Vector; control2: PFT_Vector; to_: PFT_Vector ): FT_Error; cdecl; external ft_lib name 'FT_Stroker_CubicTo'; {************************************************************** * * @function: * FT_Stroker_GetBorderCounts * * @description: * Call this function once you have finished parsing your paths * with the stroker. It will return the number of points and * contours necessary to export one of the `border' or `stroke' * outlines generated by the stroker. * * @input: * stroker :: * The target stroker handle. * * border :: * The border index. * * @output: * anum_points :: * The number of points. * * anum_contours :: * The number of contours. * * @return: * FreeType error code. 0 means success. * * @note: * When an outline, or a sub-path, is `closed', the stroker generates * two independent `border' outlines, named `left' and `right'. * * When the outline, or a sub-path, is `opened', the stroker merges * the `border' outlines with caps. The `left' border receives all * points, while the `right' border becomes empty. * * Use the function @FT_Stroker_GetCounts instead if you want to * retrieve the counts associated to both borders. *} function FT_Stroker_GetBorderCounts( stroker: FT_Stroker; border: FT_StrokerBorder; out anum_points: FT_UInt; out anum_contours: FT_UInt ): FT_Error; cdecl; external ft_lib name 'FT_Stroker_GetBorderCounts'; {************************************************************** * * @function: * FT_Stroker_ExportBorder * * @description: * Call this function after @FT_Stroker_GetBorderCounts to * export the corresponding border to your own @FT_Outline * structure. * * Note that this function will append the border points and * contours to your outline, but will not try to resize its * arrays. * * @input: * stroker :: * The target stroker handle. * * border :: * The border index. * * outline :: * The target outline handle. * * @note: * Always call this function after @FT_Stroker_GetBorderCounts to * get sure that there is enough room in your @FT_Outline object to * receive all new data. * * When an outline, or a sub-path, is `closed', the stroker generates * two independent `border' outlines, named `left' and `right' * * When the outline, or a sub-path, is `opened', the stroker merges * the `border' outlines with caps. The `left' border receives all * points, while the `right' border becomes empty. * * Use the function @FT_Stroker_Export instead if you want to * retrieve all borders at once. *} procedure FT_Stroker_ExportBorder( stroker: FT_Stroker; border: FT_StrokerBorder; outline: PFT_Outline ); cdecl; external ft_lib name 'FT_Stroker_ExportBorder'; {************************************************************** * * @function: * FT_Stroker_GetCounts * * @description: * Call this function once you have finished parsing your paths * with the stroker. It returns the number of points and * contours necessary to export all points/borders from the stroked * outline/path. * * @input: * stroker :: * The target stroker handle. * * @output: * anum_points :: * The number of points. * * anum_contours :: * The number of contours. * * @return: * FreeType error code. 0 means success. *} function FT_Stroker_GetCounts( stroker: FT_Stroker; out anum_points: FT_UInt; out anum_contours: FT_UInt ): FT_Error; cdecl; external ft_lib name 'FT_Stroker_GetCounts'; {************************************************************** * * @function: * FT_Stroker_Export * * @description: * Call this function after @FT_Stroker_GetBorderCounts to * export the all borders to your own @FT_Outline structure. * * Note that this function will append the border points and * contours to your outline, but will not try to resize its * arrays. * * @input: * stroker :: * The target stroker handle. * * outline :: * The target outline handle. *} procedure FT_Stroker_Export( stroker: FT_Stroker; outline: PFT_Outline ); cdecl; external ft_lib name 'FT_Stroker_Export'; {************************************************************** * * @function: * FT_Stroker_Done * * @description: * Destroy a stroker object. * * @input: * stroker :: * A stroker handle. Can be NULL. *} procedure FT_Stroker_Done( stroker: FT_Stroker ); cdecl; external ft_lib name 'FT_Stroker_Done'; {************************************************************** * * @function: * FT_Glyph_Stroke * * @description: * Stroke a given outline glyph object with a given stroker. * * @inout: * pglyph :: * Source glyph handle on input, new glyph handle on output. * * @input: * stroker :: * A stroker handle. * * destroy :: * A Boolean. If 1, the source glyph object is destroyed * on success. * * @return: * FreeType error code. 0 means success. * * @note: * The source glyph is untouched in case of error. *} function FT_Glyph_Stroke( var glyph: FT_Glyph; stroker: FT_Stroker; destroy: FT_Bool ): FT_Error; cdecl; external ft_lib name 'FT_Glyph_Stroke'; {************************************************************** * * @function: * FT_Glyph_StrokeBorder * * @description: * Stroke a given outline glyph object with a given stroker, but * only return either its inside or outside border. * * @inout: * pglyph :: * Source glyph handle on input, new glyph handle on output. * * @input: * stroker :: * A stroker handle. * * inside :: * A Boolean. If 1, return the inside border, otherwise * the outside border. * * destroy :: * A Boolean. If 1, the source glyph object is destroyed * on success. * * @return: * FreeType error code. 0 means success. * * @note: * The source glyph is untouched in case of error. *} function FT_Glyph_StrokeBorder( var glyph: FT_Glyph; stroker: FT_Stroker; inside: FT_Bool; destroy: FT_Bool ): FT_Error; cdecl; external ft_lib name 'FT_Glyph_StrokeBorder'; {$ENDIF TYPE_DECL}